Hibernate Caching হল একটি কার্যকর কৌশল যা Hibernate ORM-এ পারফরম্যান্স উন্নত করতে ব্যবহৃত হয়। Caching-এর মাধ্যমে ডেটাবেস থেকে বারবার ডেটা অনুসন্ধান করার প্রয়োজন কমিয়ে আনা হয়, যার ফলে অ্যাপ্লিকেশনের পারফরম্যান্স উল্লেখযোগ্যভাবে বৃদ্ধি পায়। Hibernate-এ caching ব্যবহারের মূল উদ্দেশ্য হল ডেটাবেসে থাকা ডেটার কপি সিস্টেমের মধ্যে সংরক্ষণ করা, যাতে পরবর্তীতে সেই ডেটা পাওয়ার জন্য নতুন করে ডেটাবেসে কোয়েরি না পাঠাতে হয়।
Hibernate Caching মূলত দুটি ভাগে বিভক্ত:
এখানে, Hibernate Caching সম্পর্কে বিস্তারিত আলোচনা করা হবে এবং প্রথম এবং দ্বিতীয় লেভেল ক্যাশিং কিভাবে কাজ করে তা ব্যাখ্যা করা হবে।
First-Level Cache Hibernate-এ ডিফল্টভাবে সক্ষম থাকে এবং এটি session পর্যায়ের ক্যাশিং। এর মানে হলো, একবার একটি অবজেক্ট সেশন থেকে রিট্রিভ করা হলে, এটি সেই সেশনের মধ্যে ক্যাশ হয়ে যায়। যখনই ওই অবজেক্টটি পরবর্তী সময়ে রিট্রিভ করা হয়, তখন এটি ক্যাশ থেকে পাওয়া যাবে এবং ডেটাবেসে গিয়ে নতুন করে অনুসন্ধান করতে হবে না।
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class FirstLevelCacheExample {
public static void main(String[] args) {
// Create session factory
SessionFactory factory = new Configuration()
.configure("hibernate.cfg.xml")
.addAnnotatedClass(Student.class)
.buildSessionFactory();
// Create session
Session session = factory.getCurrentSession();
try {
// Start a transaction
session.beginTransaction();
// Retrieve a student object
Student student1 = session.get(Student.class, 1); // First time DB hit
// Retrieve the same student object again (No DB hit, fetched from cache)
Student student2 = session.get(Student.class, 1); // Second time, from first-level cache
// Display the student
System.out.println(student1);
System.out.println(student2); // Same object as student1
// Commit the transaction
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Second-Level Cache হল একটি অ্যাপ্লিকেশন-স্কোপড ক্যাশ যা SessionFactory পর্যায়ে কাজ করে। এই ক্যাশটি session এর বাইরে কাজ করে এবং একাধিক sessions এর মধ্যে ডেটা শেয়ার করে। এটি আপনাকে একই ডেটাবেস রেকর্ডকে একাধিক সেশনের মধ্যে পুনরায় রিট্রিভ করতে সাহায্য করে, যা অ্যাপ্লিকেশন পারফরম্যান্সে উন্নতি আনে।
Second-level cache সক্রিয় করতে আপনাকে Hibernate কনফিগারেশনে কিছু সেটিংস যুক্ত করতে হবে।
<hibernate-configuration>
<session-factory>
<!-- JDBC Database connection settings -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/your_database_name</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">password</property>
<!-- Second Level Cache -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.ehcache.EhCacheProvider</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_query_cache">true</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- Echo all executed SQL to stdout -->
<property name="hibernate.show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hibernate.hbm2ddl.auto">update</property>
</session-factory>
</hibernate-configuration>
@Cache
অ্যানোটেশন ব্যবহার করবেন।import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) // Enable caching for this entity
public class Student {
@Id
private int id;
private String name;
private String course;
// Getters and Setters
}
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.cache.ehcache.internal.EhcacheRegionFactory;
public class SecondLevelCacheExample {
public static void main(String[] args) {
// Create session factory
SessionFactory factory = new Configuration()
.configure("hibernate.cfg.xml")
.addAnnotatedClass(Student.class)
.buildSessionFactory();
// Create session
Session session = factory.getCurrentSession();
try {
session.beginTransaction();
// Retrieve a student object (first query to DB)
Student student1 = session.get(Student.class, 1);
System.out.println(student1);
// Second query to fetch the same student (from second-level cache)
Student student2 = session.get(Student.class, 1);
System.out.println(student2); // The object is fetched from cache
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Hibernate এছাড়াও query cache প্রদান করে, যা কোয়েরির ফলাফল ক্যাশ করে, এবং পরবর্তীতে একই কোয়েরি চলালে সেগুলি ক্যাশ থেকে ফেরত পাওয়া যায়।
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import java.util.List;
public class QueryCacheExample {
public static void main(String[] args) {
// Create session factory
SessionFactory factory = new Configuration()
.configure("hibernate.cfg.xml")
.addAnnotatedClass(Student.class)
.buildSessionFactory();
// Create session
Session session = factory.getCurrentSession();
try {
// Start a transaction
session.beginTransaction();
// Enable query cache
session.enableFilter("student_filter");
// Use cache to fetch students
Query<Student> query = session.createQuery("from Student where course='Java'", Student.class);
query.setCacheable(true); // Enable query caching
// Execute the query
List<Student> students = query.getResultList();
students.forEach(System.out::println);
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
In this example:
setCacheable(true)
enables the query cache for the query.Hibernate supports several cache providers for second-level cache:
You can configure any of these cache providers in the Hibernate configuration to enable second-level caching.
Hibernate Caching greatly improves application performance by reducing the number of database queries. The First-Level Cache is automatically enabled and works within the session scope, while the Second-Level Cache can be enabled and configured to work across multiple sessions. The Query Cache caches query results to improve performance for repeated queries. Proper use of caching in Hibernate can reduce load times, enhance scalability, and improve overall system performance.
Caching হল একটি performance optimization কৌশল, যা ডেটাবেস অ্যাপ্লিকেশনগুলিতে প্রাপ্ত ডেটার কপি সংরক্ষণ করে, যাতে ভবিষ্যতে সেই ডেটা দ্রুত অ্যাক্সেস করা যায়। Hibernate ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক ডেটাবেস অ্যাপ্লিকেশনগুলির পারফরম্যান্স বৃদ্ধি করার জন্য একটি শক্তিশালী কেচিং মেকানিজম প্রদান করে। Hibernate ক্যাশিং প্রযুক্তি Query Performance এবং Data Fetching Efficiency উন্নত করতে সাহায্য করে।
Hibernate কেচিং ডেটাবেসের মধ্যে পুনরায় একই ডেটা অ্যাক্সেস করার সময় ডেটা রিটার্ন করার জন্য শুধুমাত্র কেচে রাখা ডেটা ব্যবহার করে, যা ডেটাবেসের লোড কমায় এবং অ্যাপ্লিকেশনের কর্মক্ষমতা (performance) বৃদ্ধি করে।
Hibernate দুটি স্তরের ক্যাশিং সমর্থন করে:
First Level Cache ব্যবহারের উদাহরণ:
Session session = sessionFactory.openSession();
session.beginTransaction();
// First time data fetch, Hibernate loads data from the database
User user = session.get(User.class, 1);
// Second time data fetch, Hibernate retrieves data from first level cache (no database hit)
User cachedUser = session.get(User.class, 1);
session.getTransaction().commit();
session.close();
এখানে, First Level Cache প্রথমবার User অবজেক্ট ডেটাবেস থেকে লোড করার পরে সেটি ক্যাশে সংরক্ষণ করে। পরবর্তীভাবে যখন একই অবজেক্ট আবার অনুসন্ধান করা হয়, তখন এটি ক্যাশ থেকে সরাসরি ফিরিয়ে দেয়।
Second Level Cache হল একটি SessionFactory-এর সাথে সম্পর্কিত ক্যাশিং স্তর। এটি Session এর সীমাবদ্ধতা থেকে বাইরে কাজ করে এবং সমস্ত Session এর মধ্যে শেয়ার করা হয়। Second Level Cache মূলত SessionFactory লেভেল সিঙ্গেল ক্যাশে হিসাব করা যায় এবং এটি একটি global cache হিসেবে কাজ করে।
Second Level Cache ব্যবহারের উদাহরণ:
Session session = sessionFactory.openSession();
session.beginTransaction();
// First time data fetch, data will be loaded from the database
User user = session.get(User.class, 1);
// Second time data fetch, data will be retrieved from second level cache
User cachedUser = session.get(User.class, 1);
session.getTransaction().commit();
session.close();
এখানে, যখন প্রথমবার User অবজেক্ট ডেটাবেস থেকে লোড করা হয়, তখন এটি Second Level Cache-এ সংরক্ষণ করা হয়। পরবর্তী Session এ যখন আবার একই অবজেক্টে অ্যাক্সেস করা হয়, তখন তা Second Level Cache থেকে পাওয়া যায় এবং ডেটাবেসে কোনো নতুন কুয়েরি চলে না।
Hibernate ক্যাশিং ব্যবহারের প্রধান উদ্দেশ্য হল ডেটাবেসের প্রতি চাপ কমানো এবং অ্যাপ্লিকেশন পারফরম্যান্স বৃদ্ধি করা। কিছু গুরুত্বপূর্ণ সুবিধা নিচে দেওয়া হল:
Hibernate ক্যাশিং সিস্টেম ব্যবহারের জন্য আপনাকে কিছু কনফিগারেশন করতে হবে, যেমন hibernate.cfg.xml
ফাইলে ক্যাশিং ব্যবস্থাকে সক্রিয় করা। Hibernate সাধারণত EHCache অথবা Infinispan ক্যাশিং সিস্টেমের সাথে কাজ করে।
<hibernate-configuration>
<session-factory>
<!-- Enable Second-Level Cache -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- Cache Provider -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<!-- Enable Query Cache -->
<property name="hibernate.cache.use_query_cache">true</property>
<!-- Cache region factory -->
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
</session-factory>
</hibernate-configuration>
এখানে:
hibernate.cache.use_second_level_cache
ক্যাশিং সক্ষম করে।hibernate.cache.provider_class
ক্যাশ প্রোভাইডার (এখানে EhCache ব্যবহার করা হয়েছে) নির্দেশ করে।hibernate.cache.use_query_cache
ক্যাশে queries সংরক্ষণের জন্য সঠিক কনফিগারেশন।Hibernate ক্যাশিং ব্যবহারের মাধ্যমে আপনি performance improvement, reduced database load, এবং faster data retrieval পেতে পারেন। First Level Cache ডিফল্টভাবে Session এর জন্য কাজ করে, এবং Second Level Cache SessionFactory এর জন্য কার্যকরী থাকে। Hibernate ক্যাশিং ডেটাবেসের সাথে ইন্টারঅ্যাকশনকে আরও কার্যকরী এবং দ্রুত করে তোলে, বিশেষ করে যখন অ্যাপ্লিকেশন বড় এবং ডেটার পুনরায় অ্যাক্সেস করা হয়। Hibernate ক্যাশিং কনফিগারেশন সহজ এবং এটি পারফরম্যান্সের ক্ষেত্রে বড় সাহায্য প্রদান করে।
Hibernate এ First-Level Cache (Session Cache) হল একটি session scope এর মধ্যে কাজ করা ক্যাশিং মেকানিজম। এটি Hibernate-এর default cache এবং এটি Hibernate session-এর জন্য স্বয়ংক্রিয়ভাবে ব্যবহৃত হয়। First-level cache Hibernate সেশনের সাথে সম্পর্কিত এবং এটি session object এর মধ্যে ডেটা স্টোর করে রাখে। এটি ডেটাবেস থেকে ডেটা পুনরায় লোড না করে, ক্যাশে থেকে ডেটা সরবরাহ করে, ফলে অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি পায়।
এখানে আমরা একটি উদাহরণ দেখব যেখানে first-level cache ব্যবহৃত হচ্ছে। উদাহরণে, আমরা Employee entity এর একটি instance তৈরি করব এবং প্রথমবার ডেটাবেস থেকে রিট্রিভ করার পর ক্যাশে কীভাবে তা সংরক্ষিত হচ্ছে তা দেখব।
import javax.persistence.*;
@Entity
@Table(name="employee")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="name")
private String name;
@Column(name="salary")
private double salary;
// Constructors, Getters and Setters
public Employee() {}
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
public class FirstLevelCacheExample {
public static void main(String[] args) {
// SessionFactory তৈরি করা
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
// Session তৈরি করা
Session session = factory.getCurrentSession();
try {
// 1st Query - Employee object get করা (First-level cache এর মধ্যে সংরক্ষিত)
session.beginTransaction();
Employee employee1 = session.get(Employee.class, 1); // First query, will hit DB
System.out.println("Employee Retrieved: " + employee1.getName());
// 2nd Query - একই Employee object আবার get করা (First-level cache থেকে ফিরে আসবে)
Employee employee2 = session.get(Employee.class, 1); // Second query, will use the cache
System.out.println("Employee Retrieved Again: " + employee2.getName());
// Check if both references are pointing to the same object in memory
System.out.println("Are both references the same? " + (employee1 == employee2));
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Employee Retrieved: John Doe
Employee Retrieved Again: John Doe
Are both references the same? true
এখানে:
employee1
রিট্রিভ করা হলে, Hibernate ডেটাবেস থেকে ডেটা আনে।employee2
রিট্রিভ করা হলে, Hibernate ডেটাবেসে কুয়েরি না করে first-level cache থেকে ডেটা ফেরত দেয়।employee1 == employee2
সত্য হয়।ফিচার | বিবরণ |
---|---|
Performance Improvement | First-level cache ডেটাবেসের প্রতি কুয়েরি সংখ্যা কমিয়ে পারফরম্যান্স উন্নত করে। |
Avoid Duplicate Queries | একবার ডেটা লোড হলে, এটি প্রথম সেশনে পুনরায় লোড করা হয় না। |
Automatic and Transparent | First-level cache স্বয়ংক্রিয়ভাবে কার্যকর হয় এবং ডেভেলপারদের কাছে কিছু কনফিগারেশন প্রয়োজন হয় না। |
Session-Specific Cache | এটি সেশনের মধ্যে একটি ডেটা পয়েন্টের জন্য নিশ্চিত করে যে ডুপ্লিকেট কুয়েরি না হয়। |
Hibernate এর First-Level Cache (Session Cache) হল একটি শক্তিশালী এবং প্রয়োজনীয় ফিচার যা session scope এর মধ্যে অবজেক্টগুলিকে ক্যাশে রাখে এবং পুনরায় ডেটাবেস কুয়েরি না করে ডেটা সরবরাহ করে। এটি performance বৃদ্ধি করতে সাহায্য করে এবং duplicate queries কমায়। তবে, cross-session ক্যাশিংয়ের জন্য Hibernate-এর Second-Level Cache ব্যবহার করা উচিত।
Hibernate একটি Object-Relational Mapping (ORM) ফ্রেমওয়ার্ক যা ডেটাবেসের সঙ্গে Java objects এর ইন্টারঅ্যাকশন সহজ করে। Hibernate বিভিন্ন ধরণের ক্যাশিং মেকানিজম সাপোর্ট করে, যার মধ্যে Second Level Cache খুবই গুরুত্বপূর্ণ। Second Level Cache হল একটি ক্যাশ স্তর যা SessionFactory এর উপর ভিত্তি করে কাজ করে এবং এটি Hibernate ক্যাশিং পদ্ধতির মধ্যে একটি অতিরিক্ত স্তর সরবরাহ করে।
Second Level Cache মূলত ডেটাবেস থেকে বারবার ডেটা পুনরুদ্ধার করার পরিবর্তে ডেটার একটি কপি ক্যাশে রেখে ব্যবহৃত হয়, যা অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে সাহায্য করে।
Hibernate দুইটি জনপ্রিয় ক্যাশিং প্রোভাইডার সাপোর্ট করে:
এই ক্যাশিং টুলস Hibernate এর Second Level Cache এর জন্য ব্যবহৃত হয়।
EHCache একটি ওপেন সোর্স ক্যাশিং লাইব্রেরি যা second level cache হিসাবে খুবই জনপ্রিয় এবং Hibernate এর সাথে সহজে ইন্টিগ্রেট করা যায়। এটি Java এর জন্য একটি শক্তিশালী ক্যাশিং সিস্টেম সরবরাহ করে, এবং এটি ডেটা ক্যাশিং, object caching, query caching, এবং distributed caching এর জন্য ব্যবহৃত হয়।
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.4.32.Final</version> <!-- Or the latest version -->
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.0</version> <!-- Or the latest version -->
</dependency>
<hibernate-configuration>
<session-factory>
<!-- Enable second level cache -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.EhCacheRegionFactory
</property>
<property name="hibernate.cache.provider_configuration_file_resource_path">
/ehcache.xml
</property>
<property name="hibernate.cache.use_query_cache">true</property>
</session-factory>
</hibernate-configuration>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ehcache.org/ehcache.xsd
http://ehcache.org/schema/ehcache http://ehcache.org/schema/ehcache.xsd"
xmlns="http://ehcache.org/schema/ehcache">
<cache name="com.example.MyEntity"
maxEntriesLocalHeap="1000"
eternal="false"
timeToIdleSeconds="600"
timeToLiveSeconds="1200"
overflowToDisk="false"
statistics="true">
</cache>
</ehcache>
ব্যাখ্যা:
hibernate.cache.region.factory_class
সেটিংয়ে EHCache এর জন্য EhCacheRegionFactory
নির্ধারণ করা হয়েছে।ehcache.xml
ফাইলে নির্ধারিত হয়েছে যেখানে ডেটা ক্যাশিং সম্পর্কিত সেটিংস যেমন maximum entries, expiry time ইত্যাদি কনফিগার করা হয়েছে।OSCache একটি open-source ক্যাশিং লাইব্রেরি যা Hibernate এর second level cache হিসাবে ব্যবহৃত হতে পারে। এটি হাই- পারফরম্যান্স ক্যাশিং সমাধান সরবরাহ করে এবং in-memory এবং disk-based ক্যাশিং উভয় সাপোর্ট করে।
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-oscache</artifactId>
<version>3.2.6.ga</version> <!-- Or the latest version -->
</dependency>
<dependency>
<groupId>net.sf.oscache</groupId>
<artifactId>oscache</artifactId>
<version>2.4.1</version> <!-- Or the latest version -->
</dependency>
<hibernate-configuration>
<session-factory>
<!-- Enable second level cache -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">
org.hibernate.cache.oscache.OSCacheProvider
</property>
<property name="hibernate.cache.use_query_cache">true</property>
</session-factory>
</hibernate-configuration>
<cache>
<name>com.example.MyEntity</name>
<maxElementsInMemory>1000</maxElementsInMemory>
<eternal>false</eternal>
<timeToLive>600</timeToLive>
<timeToIdle>300</timeToIdle>
</cache>
ব্যাখ্যা:
hibernate.cache.region.factory_class
এ OSCacheProvider
ব্যবহৃত হয়েছে।Feature | EHCache | OSCache |
---|---|---|
Performance | High performance, especially for large-scale applications. | Good for general use but less efficient for large-scale apps. |
Ease of Use | Easy to integrate and configure with Hibernate. | Requires some setup and may need more maintenance. |
Memory Management | Supports in-memory and disk-based storage, fine-tuned eviction policies. | Primarily in-memory with basic eviction policies. |
Distributed Caching | Supports distributed caching and replication (via Terracotta integration). | Limited support for distributed caching. |
Maturity | Widely adopted, actively maintained. | Older, less actively maintained. |
Integration | Seamless with Hibernate and popular frameworks. | Can be used with Hibernate but requires more configuration. |
Hibernate Second Level Cache এর মাধ্যমে ডেটাবেস অ্যাক্সেস অপটিমাইজ করা হয় এবং ডেটাবেসের উপর চাপ কমানো হয়। EHCache এবং OSCache দুটি জনপ্রিয় ক্যাশিং প্রোভাইডার যা Hibernate এর সেকেন্ড লেভেল ক্যাশের জন্য ব্যবহৃত হয়। EHCache একটি শক্তিশালী এবং কার্যকরী ক্যাশিং সিস্টেম সরবরাহ করে, এবং এটি distributed caching এর জন্য এক্সটেনশন সরবরাহ করে, যা বড় আর্কিটেকচারগুলির জন্য উপযুক্ত। অন্যদিকে, OSCache সিম্পল ক্যাশিং সমাধান সরবরাহ করে, কিন্তু এতে distributed caching এর সমর্থন কম।
অতএব, আপনার প্রয়োজনের উপর নির্ভর করে আপনি EHCache বা OSCache এর মধ্যে যেকোনো একটি ক্যাশিং সিস্টেম নির্বাচন করতে পারেন।
Hibernate একটি জনপ্রিয় Object-Relational Mapping (ORM) ফ্রেমওয়ার্ক যা ডেটাবেসের সাথে যোগাযোগের জন্য caching mechanisms সরবরাহ করে। Query Cache এবং Hibernate Caching Strategy ডেটাবেসের পারফরম্যান্স বৃদ্ধি করতে এবং ডেটাবেস থেকে বারবার একই ডেটা পুনরুদ্ধার করার সময় কম লোড তৈরি করতে সহায়ক। Hibernate বিভিন্ন স্তরের ক্যাশিং (caching) সাপোর্ট করে, যা ডেটাবেসের পারফরম্যান্সে যথেষ্ট উন্নতি করতে পারে।
Hibernate-এর ক্যাশিং two levels এ কাজ করে:
Session
এর মধ্যে কোনো ডেটা খোঁজা হয়। একবার একটি entity ফেচ করা হলে, পরবর্তী খোঁজগুলির জন্য এটি একই Session এর মধ্যে ক্যাশ থেকে সরবরাহ করা হয়।Hibernate এর caching strategy ডেটার সঠিক অ্যাক্সেস এবং সংশ্লেষণের জন্য বিভিন্ন স্তরের ক্যাশিং ব্যবহার করে। Hibernate এ কিছু ক্যাশিং স্ট্র্যাটেজি আছে:
Hibernate এ Query Cache ব্যবহারের জন্য আপনাকে কিছু সেটিংস কনফিগার করতে হবে এবং কিছু নির্দিষ্ট queries ক্যাশে রাখতে হবে।
প্রথমে, Hibernate configuration ফাইলে second-level cache এবং query cache সক্রিয় করতে হবে। নিচে এর একটি উদাহরণ দেওয়া হল।
<hibernate-configuration>
<session-factory>
<!-- Enable second-level cache -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- Enable query cache -->
<property name="hibernate.cache.use_query_cache">true</property>
<!-- Set cache provider (Ehcache example) -->
<property name="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.EhCacheRegionFactory
</property>
<!-- Cache settings for Ehcache -->
<property name="hibernate.cache.provider_configuration_file_resource_path">/ehcache.xml</property>
</session-factory>
</hibernate-configuration>
এখানে, hibernate.cache.use_query_cache
প্রপার্টি true
সেট করা হয়েছে, যাতে query cache সক্রিয় হয়।
আপনি নির্দিষ্ট HQL (Hibernate Query Language) বা Criteria API queries এর জন্য ক্যাশিং সক্রিয় করতে পারেন।
Example: Query Cache with HQL:
import org.hibernate.Session;
import org.hibernate.query.Query;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateApp {
public static void main(String[] args) {
// Create SessionFactory
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Employee.class).buildSessionFactory();
Session session = factory.getCurrentSession();
try {
// Begin transaction
session.beginTransaction();
// Create HQL query
Query<Employee> query = session.createQuery("from Employee where department = :department", Employee.class);
query.setParameter("department", "IT");
// Enable query cache
query.setCacheable(true);
// Execute the query and get results from cache or database
List<Employee> employees = query.getResultList();
for (Employee emp : employees) {
System.out.println(emp.getName());
}
// Commit transaction
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Explanation:
query.setCacheable(true)
: এটি query cache কে সক্ষম করে, এবং query result যদি ক্যাশে থাকে, তবে এটি ডেটাবেস থেকে পুনরুদ্ধারের পরিবর্তে ক্যাশ থেকে সরবরাহ করা হবে।Hibernate বিভিন্ন caching providers ব্যবহার করে second-level cache এবং query cache এর কার্যকারিতা বৃদ্ধি করতে পারে। কিছু জনপ্রিয় cache providers হল:
Query Cache এবং second-level cache এর মাধ্যমে Hibernate আপনাকে ডেটাবেসের কাজের গতি উন্নত করতে সহায়ক ফিচার প্রদান করে, বিশেষ করে যখন আপনার অ্যাপ্লিকেশন ডেটাবেসে প্রচুর read-heavy operations সম্পাদন করে।
Read more